home *** CD-ROM | disk | FTP | other *** search
/ Cracking 2 / Cracking II..iso / Tools / ApiHooks 3.0 / APIWORKS.INC < prev    next >
Encoding:
Text File  |  2000-06-19  |  26.0 KB  |  613 lines

  1. ;------------------------------------------------------------------------------
  2. ;Remote code for ApiHooks.
  3.  
  4. ALIGN 4
  5.  
  6. AlienScout         :
  7.  
  8.  ASSUME EDI: PTR DWORD
  9.  
  10. ;used local variables (related to AlienDLL), EDI points to AlienDLL
  11.     VirtualQuery        EQU    [EDI][_VirtualQuery       - AlienDLL]
  12.     GetModuleFileNameA  EQU    [EDI][_GetModuleFileNameA - AlienDLL]
  13.     LoadLibraryA        EQU    [EDI][_LoadLibraryA       - AlienDLL]
  14.     FreeLibrary         EQU    [EDI][_FreeLibrary        - AlienDLL]
  15.     GetProcAddress      EQU    [EDI][_GetProcAddress     - AlienDLL]
  16.     GetModuleHandleA    EQU    [EDI][_GetModuleHandleA   - AlienDLL]
  17.     VirtualProtect      EQU    [EDI][_VirtualProtect     - AlienDLL]
  18.     lstrcmpiA           EQU    [EAX] ;[_lstrcmpiA                - AlienDLL]
  19.     KERNEL32_ORD_0001   EQU    [EDI][_KERNEL32_ORD_0001  - AlienDLL]
  20.     ModCounter          EQU    [EDI][_VirtualQuery       - AlienDLL]
  21.     Modules             EQU    [EDI][_Modules            - AlienDLL]
  22.     ModExclude          EQU    [EDI][_GetModuleFileNameA - AlienDLL]
  23.  
  24.  
  25.   AlienThread  PROC
  26.                PUSHp  EAX, EBX, EBP, ESI, EDI
  27.                CLD
  28.                CALL   Delta
  29.               Delta:
  30.                POP    EDI
  31.                ADD    EDI, (AlienDLL - Delta)  ;all is relative to AlienDLL
  32.              ;make place on the stack
  33.                SUB    ESP, SIZEOF MEMORY_BASIC_INFORMATION+MAXMODULES*4
  34.  
  35.                SUB    EBP, EBP
  36.                CALL   @F
  37.  
  38. ;==============TxHandler
  39.                MOV    EDX, [ESP+12] ;context
  40.                CALL   Delta3
  41.               Delta3:
  42.                POP    EAX
  43.                ADD    EDX, CONTEXT.regEip
  44.  
  45.               TxGPF01:
  46.                ADD    EAX, (GPF01-Delta3)    ;fault at GPF01?
  47.                CMP    EAX, [EDX+CONTEXT.regEip-CONTEXT.regEip]
  48.                LEA    EAX, [EAX][CheckNextModule-GPF01]  ;new EIP
  49.                JE     TxHFin                 ;yes -> go on at CheckNextModule
  50.               TxGPF02:
  51.                ADD    EAX, (GPF02-CheckNextModule)  ;fault at GPF02?
  52.                CMP    EAX, [EDX+CONTEXT.regEip-CONTEXT.regEip]
  53.                LEA    EAX, [EAX][NImpHook-GPF02]
  54.                JE     TxHFin                 ;yes -> go on at NImpHook
  55.               TxHStandard:
  56.                ADD    EAX, (TDrWatson-NImpHook) ;unknown fault -> go on at DrWatson
  57.                oMOV   [EDX+CONTEXT.regEsp-CONTEXT.regEip], [ESP+8] ;new ESP
  58.               TxHFin:
  59.                MOV    [EDX+CONTEXT.regEip-CONTEXT.regEip], EAX ;adjust EIP
  60.                SUB    EAX, EAX    ;ExceptionContinueExecution
  61.                RETN
  62. ;==============TxHandler
  63.  
  64.              @@:
  65.                PUSH   FS:(TEB PTR [EBP]).ExceptionList   ;build xframe
  66.                MOV    FS:(TEB PTR [EBP]).ExceptionList, ESP
  67.  
  68. ;==============EnumerateProcessModules
  69.    ;build NULL terminated list of image bases of modules present in this process
  70.  
  71.                LEA    ESI, [ESP+8]               ;here will be module bases
  72.                LEA    EBX, [ESP+MAXMODULES*4+8]  ;here will be place for VirtualQuery
  73.                ASSUME EBX: PTR MEMORY_BASIC_INFORMATION
  74.                MOV    Modules, ESI
  75.           NextMem:
  76.                CMP    ESI, EBX     ;to many modules?
  77.                JAE    FinMod       ;yes -> stop enumeration
  78.                sWin32 VirtualQuery, EBP, EBX, SIZEOF MEMORY_BASIC_INFORMATION
  79.                TEST   EAX, EAX
  80.                JE     FinMod       ;when VQ fails we're done (to high address)
  81.              @@:
  82.                MOV    EBP, [EBX].BaseAddress
  83.                sWin32 GetModuleFileNameA, EBP, ESI, 2   ;is there some module on the base address?
  84.                TEST   EAX, EAX
  85.                JE     @F           ;no -> next address
  86.                TEST   EBP, EBP     ;yes, but is it special case of NULL (= main module)?
  87.                JE     @F           ;yes it was the special case -> next address
  88.                MOV    [ESI], EBP   ;there is module, put down its image address
  89.                LODSD               ;ESI to the next prosition
  90.               @@:
  91.                ADD    EBP, [EBX].RegionSize  ;create new address
  92.                JMP    NextMem
  93.              FinMod:
  94.                AND    DWORD PTR [ESI],0  ;NULL terminated list
  95.                ASSUME EBX: NOTHING
  96. ;==============EnumerateProcessModules
  97.  
  98.                MOV    EBX, EDI ;DllName or dynaimc hooks address
  99.  
  100.                AND    ModExclude, 0  ;initialize pointer to image bases to
  101.                                      ;exclude to NULL
  102.              ;check for dynamic hooks
  103.                ASSUME ESI : PTR API_HOOK
  104.                MOV    ESI, [EBX+4]   ;pointer to dynamic hooks in this process
  105.                CMP    DWORD PTR [EBX], HOOKS_DYNAMIC
  106.                JNE    @F             ;go Hooks.dll
  107.                ;yes there are dynaimc hooks then UnhookAddresses
  108.                ;can contain pointer to image bases to exclude
  109.                PUSH   [ESI].UnhookAddresses
  110.                POP    ModExclude
  111.                JMP    NewHook0       ;start with the next AH structure
  112.  
  113.              ;it is Hooks.dll
  114.               @@:
  115.                sWin32 GetModuleHandleA, EBX  ;test if hooks.dll is present here
  116.                TEST   EAX, EAX
  117.                JNE    HANFailed   ;fail if already present in this process
  118.  
  119.                sWin32 LoadLibraryA, EBX   ;load hooks.dll
  120.                TEST   EAX, EAX
  121.                JE     @F          ;HANFailed can't load it
  122.  
  123.                ;get address of GetApiHookChain
  124.                MOV    EBX, EAX
  125.                LEA    ECX, [EDI][GetAHC-AlienDLL]
  126.                MOV    ESI, GetProcAddress
  127.                sWin32 ESI, EBX, ECX
  128.                TEST   EAX, EAX
  129.                JE     CheckAHC
  130.                sWin32 EAX         ;call GetApiHookChain
  131.                JMP    ProcFound
  132.               CheckAHC:
  133.                ;get address of ApiHookChain
  134.                LEA    ECX, [EDI][GetAHC+3-AlienDLL]
  135.                sWin32 ESI, EBX, ECX
  136.                TEST   EAX, EAX
  137.                JNE    ProcFound
  138.                ;get address of ORD_0001
  139.                sWin32 ESI, EBX, 1
  140.                TEST   EAX, EAX
  141.               @@:
  142.                JE     HANFailed   ;hooks.dll doesn't export (Get)ApiHookChain and ordinal 1
  143.              ProcFound:
  144.                XCHG   EAX, ESI    ;ESI -> AH chain
  145.  
  146.              NextHook::
  147.                AND    ModCounter, 0     ;zero module counter
  148.                MOV    EBX, [ESI].ModuleExport
  149.                CMP    EBX, HOOKS_END    ;if ModuleExport == HOOKS_END
  150.                JE     AllDone           ;we're done
  151.                sWin32 GetModuleHandleA, EBX  ;get image base of ModuleExport
  152.  
  153. COMMENT /*  here was if ModuleExport is missing load it
  154.                TEST   EAX, EAX
  155.                JNE    @F
  156.                sWin32 LoadLibraryA, EBX
  157. */
  158.                TEST   EAX, EAX
  159.               NewHook0:
  160.                JE     NewHook           ;ModuleExport is missing -> go next AH structure
  161.               @@:
  162.                XCHG   EAX, EBX          ;ModuleExport image base to EBX
  163.  
  164. ;--------------------------------------------------------------------------------
  165. ;HOOK_BY_ADDRESS: import table of chosen modules is searched for occurence
  166. ;of address of API given by ApiNameOrOrd. If it is found it is replaced
  167. ;by HookAddress.
  168.  
  169.                TEST   BYTE PTR [ESI].dwFlags, HOOK_BY_ADDRESS
  170.                JE     HookByExport   ;user doesn't want this method
  171.                sWin32 GetProcAddress, EBX, [ESI].ApiNameOrOrd
  172.                TEST   EAX, EAX
  173.                JE     HookByExport     ;API doesn't exist go on with Export works
  174.              CheckNextModule:
  175.                PUSH   EAX
  176.                sWin32 xGetModuleHandleA  ;get module for Import works
  177.                TEST   EAX, EAX
  178.                XCHG   EAX, EBX           ;base to EBX
  179.                POP    EAX                ;EAX == address of wanted API
  180.                JE     HookByExport       ;no more modules
  181.  
  182.               GPF01:  ;+CheckNextModule
  183.                MOV    EDX, [EBX+3CH]     ;PE header start
  184.                MOV    EDX, [EDX+80H+EBX] ;import table start
  185.                SUB    ECX, ECX
  186.  
  187.                TEST   EDX, EDX           ;no import
  188.                JE     CheckNextModule    ;next module
  189.  
  190.                ADD    EDX, EBX           ;edx = import table
  191.                JMP    @F
  192.               sNextMod:
  193.                ADD    ECX, 14H           ;next module entry
  194.               @@:
  195.                CMP    DWORD PTR [EDX+ECX+0CH], 0  ;module name == NULL?
  196.                JE     CheckNextModule             ;then next module
  197.                MOV    EBP, [EDX+ECX+10H]          ;address list
  198.                LEA    EBP, [EBP+EBX-4]            ;1st API address - 4
  199.               sNextProc:
  200.                CMP    DWORD PTR [EBP+4], 0        ;address == NULL?
  201.                JE     sNextMod                    ;go next module entry
  202.                CMP    EAX, [EBP+4]                ;is it wanted API address?
  203.                LEA    EBP, [EBP+4]                ;to the next API address
  204.                JNE    sNextProc                   ;no cycle
  205.  
  206.               ;make [EBP] writeable
  207.                PUSHp  EAX, ECX, EDX               ;save used registers
  208.                PUSH   EDX                         ;place for original attr.
  209.                sWin32 VirtualProtectX, EBP, 4, PAGE_READWRITE, ESP
  210.                TEST   EAX, EAX
  211.                POP    EDX                         ;original attribute
  212.                JE     @NextImport                 ;VP failed
  213.  
  214.                CALL   CheckUnhook                 ;check for saving original address
  215.  
  216.                MOV    EAX, [ESI].HookAddress      ;new api address
  217.                MOV    [EBP], EAX                  ;write it
  218.  
  219.               ;return old memory attribute
  220.                PUSH   EDX                         ;old atttribute
  221.                sWin32 VirtualProtectX, EBP, 4, EDX, ESP
  222.                POP    EDX                         ;remove superlocal var.
  223.             @NextImport:
  224.                POPc   EAX, ECX, EDX               ;restore used registers
  225.                JMP    sNextProc                   ;go on with next api
  226. ;--------------------------------------------------------------------------------
  227. ;HOOK_BY_EXPORT: export table of ModuleExport is searched for occurence
  228. ;of relative address of API given by ApiNameOrOrd. If it is found it is replaced
  229. ;by relative HookAddress.
  230.  
  231.               HookByExport:
  232.                TEST   BYTE PTR [ESI].dwFlags, HOOK_EXPORT
  233.                JE     @F      ;user doesn't want this method
  234.                sWin32 GetModuleHandleA, [ESI].ModuleExport
  235.                TEST   EAX, EAX
  236.                JE     @F     ;HookByImport  ;ModuleExport is not present
  237.                XCHG   EAX, EBX
  238.                MOV    EBP, [ESI].ApiNameOrOrd
  239.                MOV    EDX, [EBX+3CH]        ;PE header start
  240.                MOV    EDX, [EDX+78H+EBX]    ;export table
  241.                TEST   EDX, EDX
  242.               @@:
  243.                JE     GoToImport ;HookByImport ;no export table
  244.                ADD    EDX, EBX
  245.                CMP    EBP, 10000H   ;ordinal# or name?
  246.                JAE    @F
  247.                XCHG   EAX, EBP           ;eax = ordinal#
  248.                SUB    EAX, [EDX+10H]     ;eax = ordinal# - ordinal base
  249.                JMP    ExportOrd
  250.               @@:
  251.              ;search for the name of wanted api
  252.                PUSH   EBX
  253.                PUSH   ESI
  254.                PUSH   EDI
  255.                MOV    ECX, [EDX+18H] ;amountofnames
  256.                MOV    ESI, [EDX+20H] ;addressofnames
  257.                ADD    ESI, EBX
  258.                PUSH   EDX
  259.               @@:
  260.                JECXZ  NameSearchFinished  ;nothing left to explore
  261.                LODSD
  262.                SUB    EDI, EDI
  263.                ASSUME EDI: PTR BYTE
  264.                ADD    EAX, EBX
  265.                DEC    ECX
  266.               NextChar:
  267.                MOV    DL,  [EAX+EDI]     ;find matching API name
  268.                CMP    DL,  [EBP+EDI]     ;by comparing letters
  269.                JNE    @B                 ;no match go next name
  270.                INC    EDI
  271.                TEST   DL,  DL
  272.                JNE    NextChar           ;repeat until NULL character
  273.                SUB    EAX, EAX           ;api found! -> EAX = NULL
  274.               NameSearchFinished:
  275.                POP    EDX
  276.                POP    EDI
  277.                ASSUME EDI: PTR DWORD
  278.                POP    ESI
  279.                POP    EBX
  280.  
  281.                TEST   EAX, EAX
  282.                JNE    HookByImport       ;EAX != NULL -> api not found
  283.  
  284.                SUB    ECX, [EDX+18H]     ;amountofnames
  285.                MOV    EAX, [EDX+24H]     ;ordinals for names
  286.                INC    ECX
  287.                NEG    ECX
  288.                ADD    EAX, EBX
  289.                MOVZX  EAX, WORD PTR [ECX*2+EAX]
  290.              ExportOrd:
  291.                MOV    ECX, EBX           ;ecx = module base
  292.                ADD    ECX, [EDX+1CH]
  293.                LEA    EBP, [ECX+EAX*4]   ;orig address
  294.  
  295.               ;make [EBP] writeable
  296.                PUSH   EDX
  297.                sWin32 VirtualProtectX, EBP, 4, PAGE_READWRITE, ESP
  298.                TEST   EAX, EAX
  299.                POP    EDX                ;orig settings
  300.               GoToImport:
  301.                JE     HookByImport
  302.  
  303.                CALL   CheckUnhook        ;check for saving original address
  304.  
  305.                MOV    EAX, [ESI].HookAddress   ;new api address
  306.                SUB    EAX, EBX           ;make it relative to module base
  307.                MOV    [EBP], EAX         ;write it
  308.  
  309.               ;return old memory attribute
  310.                PUSH   EDX
  311.                sWin32 VirtualProtectX, EBP, 4, EDX, ESP
  312.                POP    EDX
  313.               ;go on with unbinding
  314. ;-do UNBIND----------------------------------------------------------
  315. ;If HOOK_EXPORT was used it is good in NT to break bonds of all newly
  316. ;loaded modules to ModuleExport otherwise HOOK_EXPORT would have
  317. ;no effect on such modules
  318.  
  319.                TEST   BYTE PTR [ESI].dwFlags, HOOK_NO_UNBIND
  320.               W9xJMP0::
  321.                JMP    HookByImport  ;will be patched to JNE if OS == NT
  322.                MOV    EDX, FS:TEB.pPEB
  323.                MOV    ECX, (PEB PTR [EDX]).pProcParameters
  324.                ADD    ECX, PROCESS_PARAMETERS.pFirstModEntry0
  325.                MOV    EAX, [ECX]     ;ECX == end of round queue, EAX== 1st module entry0
  326.                JMP    First0
  327.               @@:
  328.                ASSUME EAX: PTR PEB_MODULE_ENTRY0
  329.                CMP    [EAX].ImageBase, EBX
  330.                JNE    ThisIsNotModuleExport
  331.                INC    [EAX].ImageTimeStamp  ;change time stamp, there will be no matches
  332.               ThisIsNotModuleExport:        ;and binding will fail
  333.                MOV    EAX, [EAX].pNextModEntry0
  334.               First0:
  335.                CMP    EAX, ECX              ;at the end of the queue?
  336.                JNE    @B                    ;no, try next module
  337.                ASSUME EAX: NOTHING
  338. ;--------------------------------------------------------------------------------
  339. ;HOOK_IMPORT: import table of chosen modules is searched for occurence
  340. ;of API name matching to ApiNameOrOrd. If it is found it is replaced
  341. ;by HookAddress.
  342.               HookByImport:
  343.                TEST   BYTE PTR [ESI].dwFlags, HOOK_IMPORT
  344.                JE     @F         ;user doesn't want this method
  345.               NImpHook:
  346.                sWin32 xGetModuleHandleA    ;get module (from list)
  347.                TEST   EAX, EAX
  348.               @@:
  349.                JE     SkipImp            ;no more modules
  350.                XCHG   EAX, EBX           ;ebx = imag base
  351.  
  352.               GPF02:  ;+NImpHook
  353.                MOV    EDX, [EBX+3CH]     ;PE header start
  354.                MOV    EDX, [EDX+80H+EBX] ;import table start
  355.  
  356.                TEST   EDX, EDX           ;no import
  357.                JE     NImpHook
  358.  
  359.                SUB    EDI, EDI
  360.                ADD    EDX, EBX            ;edx = import table
  361.               mNextMod:
  362.                MOV    EBP, [EDX+EDI+0CH]  ;module names
  363.                TEST   EBP, EBP
  364.                JE     NImpHook            ;no more module names
  365.                ADD    EBP, EBX
  366.                ADD    EDI, 14H
  367.                PUSH   EDX
  368.                CALL   Delta0
  369.               Delta0:
  370.                POP    EAX
  371.                ASSUME EAX: PTR DWORD
  372.                ADD    EAX, (_lstrcmpiA-Delta0)
  373.                sWin32 lstrcmpiA, [ESI].ModuleExport, EBP  ;compare module names
  374.                TEST   EAX, EAX
  375.                POP    EDX
  376.                JNE    mNextMod
  377.  
  378.                MOV    EBP, [EDX+EDI-14H]  ;proc names
  379.                TEST   EBP, EBP
  380.                JE     NImpHook ;SkipImp
  381.                CMP    EBP, [EDX+EDI-14H+10H] ;address list
  382.                JE     NImpHook ;SkipImp
  383.  
  384.                MOV    EAX, [ESI].ApiNameOrOrd
  385.                JMP    @F
  386.              pNextName:
  387.                POP    EDI
  388.                POP    EDX
  389.                ADD    EBP, 4
  390.              @@:
  391.                MOV    ECX, [EBP+EBX]
  392.                JECXZ  mNextMod
  393.  
  394.                PUSH   EDX
  395.                PUSH   EDI
  396.                CMP    EAX, 10000H       ;ordinal#?
  397.                JAE    ImpByName
  398.                TEST   ECX, ECX
  399.                JNS    pNextName
  400.                CMP    AX, CX
  401.                JE     ImpSearchFinished
  402.                JMP    pNextName
  403.               ImpByName:
  404.                TEST   ECX, ECX
  405.                JS     pNextName
  406.                ADD    ECX, EBX
  407.                SUB    EDI, EDI
  408.                ASSUME EDI: PTR BYTE
  409.               pNextChar:
  410.                MOV    DL,  [EAX+EDI]       ;compare api names
  411.                CMP    DL,  [ECX+EDI+2]
  412.                JNE    pNextName
  413.                INC    EDI
  414.                TEST   DL,  DL
  415.                JNE    pNextChar
  416.               ImpSearchFinished:
  417.                POP    EDI
  418.                ASSUME EDI: PTR DWORD
  419.                POP    EDX
  420.                MOV    EAX, [EDX+EDI-14H+10H]
  421.                SUB    EBP, [EDX+EDI-14H+00H]
  422.                ADD    EBP, EAX
  423.                ADD    EBP, EBX
  424.                CALL   Delta1
  425.               Delta1:
  426.                POP    EDI
  427.                ASSUME EDI: PTR DWORD
  428.                LEA    EDI, [EDI][AlienDLL-Delta1]
  429.  
  430.               ;make [EBP] writeable
  431.                PUSH   EDX
  432.                sWin32 VirtualProtectX, EBP, 4, PAGE_READWRITE, ESP
  433.                TEST   EAX, EAX
  434.                POP    EDX                   ;orig settings
  435.                JE     @F ;NImpHook          ;here should be loop to the next name
  436.  
  437.                CALL   CheckUnhook
  438.  
  439.                MOV    EAX, [ESI].HookAddress   ;new api address
  440.                MOV    [EBP], EAX               ;write it
  441.                ;return old memory attribute
  442.                PUSH   EDX
  443.                sWin32 VirtualProtectX, EBP, 4, EDX, ESP
  444.                POP    EDX
  445.                                             ;here should be loop to the next name
  446.               @@:
  447.                JMP    NImpHook
  448. ;--------------------------------------------------------------------------------
  449.              SkipImp:
  450.              NewHook:
  451.                ADD    ESI, SIZEOF API_HOOK       ;go next AH structure
  452.                JMP    NextHook
  453.  
  454.              TDrWatson::                   ;if exception
  455.              HANFailed:                    ;or failed, go here
  456.                oMOV   EAX, ErrorRemoteExec ;return this error coed
  457.                JMP    @F
  458.              AllDone:
  459.                SUB    EAX, EAX             ;return ErrorSuccess
  460.              @@:
  461.                POP    FS:TEB.ExceptionList  ;remove xframe
  462.                ADD    ESP, SIZEOF MEMORY_BASIC_INFORMATION+MAXMODULES*4 +4 ;adjust ESP
  463.                POPp   EDI, ESI, EBP, EBX, ECX
  464.               @Stop::
  465.                DWORD  0, 0, 0               ;place reserved for RemoteExec
  466.   AlienThread  ENDP
  467.  
  468. ;============================================================================
  469.   VirtualProtectX       PROC vpWhere, vpSize, vpAttrib, vpOrgAttrib
  470.  
  471.                PC_WRITEABLE     EQU     00020000H
  472.                PC_USER          EQU     00040000H
  473.                PC_PRESENT       EQU     80000000H
  474.                PC_STATIC        EQU     20000000H
  475.                PC_DIRTY         EQU     08000000H
  476.                _PageModifyPermissions EQU   0001000DH
  477.  
  478.                MOV       EDX, vpWhere
  479.                TEST      EDX, EDX     ;above 2GB?
  480.                JNS       @F           ;no go VP
  481.                SUB       EAX, EAX     ;else test for hard hooking
  482.                TEST      BYTE PTR [ESI].dwFlags, HOOK_HARD
  483.                JE        VPFail       ;no hard hooks and above 2GB -> like VP failed
  484.                SHR       EDX, 12      ;address -> page#
  485.               ;Win9x: change 1 page attrinutes to writeable
  486.                sWin32    KERNEL32_ORD_0001, _PageModifyPermissions, EDX,  1, -1, PC_STATIC OR PC_USER OR PC_WRITEABLE
  487.                INC       EAX          ;failed?
  488.                JE        VPFail       ;yes
  489.               @@:
  490.               ;now can VP be used
  491.                sWin32    VirtualProtect, vpWhere, vpSize, vpAttrib, vpOrgAttrib
  492.               VPFail:
  493.                RET
  494.   VirtualProtectX        ENDP
  495. ;============================================================================
  496. ;Check if user wants to get old api addresses and their storage addresses
  497.  
  498.   CheckUnhook  PROC
  499.                MOV    ECX, [ESI].UnhookAddresses
  500.                JECXZ  @F                       ;it is empty -> fin
  501.                ASSUME ECX:PTR API_UNHOOK
  502.                MOV    EAX, [ECX].CurNoAddr    ;is current contents
  503.                CMP    EAX, [ECX].MaxNoAddr    ;=> max contents
  504.                JGE    @F                      ;yes -> fin
  505.                PUSH   EDX
  506.                INC    [ECX].CurNoAddr         ;++CurNoAddr
  507.                MOV    ECX, [ECX].WhereWhat
  508.                ASSUME ECX:PTR ADDR_CONTENTS
  509.                MOV    EDX, [EBP]              ;old api address
  510.               ;remember storage address
  511.                MOV    [ECX+EAX*SIZEOF ADDR_CONTENTS].ReturnWhere, EBP
  512.               ;remember old api address
  513.                MOV    [ECX+EAX*SIZEOF ADDR_CONTENTS].ReturnWhat, EDX
  514.                POP    EDX
  515.               @@:
  516.                RET
  517.                ASSUME ECX:NOTHING
  518.   CheckUnhook  ENDP
  519. ;============================================================================
  520. ;Get module handle a) from list (made by VirtualQuery) if ModuleImport == ALL_MODULES
  521. ;               or b) from standard GetModuleHandle(ModuleImport)
  522. ;but check if the returned image base is "on index" (list pointed by ModExclude)
  523. ;if it is there, try next module in the list.
  524.  
  525.   xGetModuleHandleA   PROC
  526.                CALL   Delta6
  527.               Delta6:
  528.                POP    EDI
  529.                ASSUME EDI: PTR DWORD
  530.                LEA    EDI, [EDI][AlienDLL-Delta6]
  531.  
  532.              TryNextMod:
  533.                MOV    EAX, [ESI].ModuleImport
  534.                MOV    ECX, ModCounter         ;index of module in Modules list
  535.                INC    EAX  ;CMP    EAX, ALL_MODULES
  536.                JE     @F
  537.                DEC    EAX  ;CMP    EAX, ALL_MODULES
  538.                DEC    ECX
  539.                XCHG   EAX, ECX
  540.                JGE    xGFail
  541.                sWin32 GetModuleHandleA, ECX   ;no ALL_MODULES -> pure GetModuleHandle
  542.                JMP    xGSuc
  543.               @@:                             ;was ALL_MODULES
  544.                MOV    EAX, Modules            ;head of list
  545.                MOV    EAX, [EAX+ECX*4]        ;get the indexed module
  546.               xGSuc:
  547.                TEST   EAX, EAX                ;at the end of Modules list?
  548.                JE     xGFail                  ;yes -> return NULL
  549.                INC    ModCounter              ;++index
  550.                sWin32 CheckExclude            ;check for exclusion of base in EAX
  551.                JE     TryNextMod              ;excluded -> next module
  552.                RET
  553.               xGFail:
  554.                AND    ModCounter, EAX         ;reset Mdules index
  555.                RET
  556.   xGetModuleHandleA   ENDP
  557.  
  558.    CheckExclude PROC  ;IN: EAX=ModuleBase
  559.                 MOV   EDX, ModExclude
  560.                 TEST  EDX, EDX
  561.                 JE    AllowThisMod           ;no exclude list
  562.                @@:
  563.                 CMP   DWORD PTR [EDX], NULL  ;at the end of list?
  564.                 JE    AllowThisMod           ;yes -> module can go
  565.                 CMP   EAX, [EDX]
  566.                 LEA   EDX, [EDX+4]
  567.                 JNE   @B                     ;next module to exclude
  568.                 SUB   EAX, EAX               ;found -> return NULL (==excluded)
  569.                AllowThisMod:
  570.                 TEST  EAX, EAX               ;return ZF set if Module can go
  571.                 RET
  572.    CheckExclude ENDP
  573. ;============================================================================
  574.  
  575.     ASSUME EAX :NOTHING
  576.     ASSUME ECX :NOTHING
  577.     ASSUME ESI :NOTHING
  578.     ASSUME EDI :NOTHING
  579.    GetAHC              BYTE   "GetApiHookChain",0
  580.  
  581.     ALIGN 4
  582.  
  583.   ;these dwords will be initialized in DllMain
  584.   ;but after their contents was used (saves space in ApiHooks.dll)
  585.  
  586.    NewState            LABEL  TOKEN_PRIVILEGES
  587.    _VirtualQuery       DWORD  1
  588.    dbLUID              LABEL  LUID
  589.    _GetModuleFileNameA DWORD  0
  590.    _LoadLibraryA       DWORD  0
  591.    _GetProcAddress     DWORD  SE_PRIVILEGE_ENABLED
  592.  
  593.    T32N                LABEL  SIGN
  594.    sT32N               EQU    OFFSET T32N
  595.    _GetModuleHandleA   LABEL  DWORD
  596.                        BYTE   'Thre'
  597.    _VirtualProtect     LABEL  DWORD
  598.                        BYTE   'ad32'
  599.    _lstrcmpiA          LABEL  DWORD
  600.                        BYTE   'Next'
  601.    _KERNEL32_ORD_0001  LABEL  DWORD
  602.                        BYTE   0
  603.    NTDLL               BYTE   'NTD'
  604.    sNTDLL              EQU    OFFSET NTDLL
  605.    _Modules            LABEL  DWORD
  606.                        BYTE   'LL.D'
  607.    ALIGN 4
  608.    AlienDLL            LABEL  ACHAR
  609.    AlienSize0          EQU    (($-AlienScout+3) AND NOT 3)  ;pure block size, dword aligned
  610.    AlienSize           EQU    (($-AlienScout+MAX_PATH+3) AND NOT 3) ;overall block size (with MAX_PATH), dword aligned
  611.                        BYTE   'LL',0
  612. ;------------------------------------------------------------------------------
  613.